package com.example.mq.mqserver.datacenter;

import com.example.mq.common.MqException;
import com.example.mq.mqserver.core.Binding;
import com.example.mq.mqserver.core.Exchange;
import com.example.mq.mqserver.core.MSGQueue;
import com.example.mq.mqserver.core.Message;

import java.io.IOException;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: ws
 * Date: 2023-10-03
 * Time: 16:21
 */
/*
 * 使用这个类来管理所有硬盘上的数据（数据库和文件）
 * 1. 数据库：交换机，绑定，队列
 * 2、 数据文件：消息
 * 上层逻辑如果需要操作硬盘，统一使用这个类来使用（上层代码不关心当前的数据是存储在数据库还是文件）
 */

public class DiskDataCenter {
    // 这个实例用来管理数据库中的数据
    private DataBaseManager dataBaseManager = new DataBaseManager();
    // 这个实例用来管理数据文件
    private MessageFileManger messageFileManger = new MessageFileManger();

    public void init() {
        // 针对上述两个实例初始化
        dataBaseManager.init();
        messageFileManger.init();
    }

    /*
     * 封装交换机的操作
     */
    public void insertExchange(Exchange exchange) {
        dataBaseManager.insertExchange(exchange);
    }

    public void deleteExchange(String exchangeName) {
        dataBaseManager.deleteExchange(exchangeName);
    }

    public List<Exchange> selectAllExchanges() {
        return dataBaseManager.selectAllExchanges();
    }

    /*
     * 封装队列的操作
     */
    public void insertQueue(MSGQueue queue) throws IOException {
        dataBaseManager.insertQueue(queue);
        // 创建队列的同时，不仅仅是把队列对象写入到数据库中，还要创建出对应的目录和文件
        messageFileManger.createQueueFiles(queue.getName());
    }

    public void deleteQueue(String queueName) throws IOException {
        dataBaseManager.deleteQueue(queueName);
        // 删除队列的同时，不仅仅是把队列从数据库中删除，还要删除对应的目录和文件
        messageFileManger.destroyQueueFiles(queueName);
    }

    public List<MSGQueue> selectAllQueues() {
        return dataBaseManager.selectAllQueues();
    }

    /*
     * 封装绑定的操作
     */
    public void insertBinding(Binding binding) {
        dataBaseManager.insertBinding(binding);
    }

    public void deleteBinding(Binding binding) {
        dataBaseManager.deleteBinding(binding);
    }

    public List<Binding> selectAllBindings() {
        return dataBaseManager.selectAllBindings();
    }

    /*
     * 封装消息的操作
     */
    public void sendMessage(MSGQueue queue, Message message) throws IOException, MqException {
        messageFileManger.sendMessage(queue, message);
    }

    public void deleteMessage(MSGQueue queue, Message message) throws IOException, ClassNotFoundException, MqException {
        messageFileManger.deleteMessage(queue, message);
        if (messageFileManger.checkGC(queue.getName())) {
            messageFileManger.gc(queue);
        }
    }

    public List<Message> loadAllMessageFromQueue(String queueName) throws IOException, MqException, ClassNotFoundException {
        return messageFileManger.loadAllMessageFromQueue(queueName);
    }
}
